GitHubからAWS CodeCommitにリポジトリを複製してみた
こんにちは、CX事業本部 IoT事業部の若槻です。
今回は、GitHubからAWS CodeCommitにGit Repositoryを複製する機会があったので、方法を書き残しておきます。
環境
$ sw_vers ProductName: Mac OS X ProductVersion: 10.15.7 BuildVersion: 19H15 % aws --version aws-cli/2.0.28 Python/3.7.4 Darwin/19.6.0 botocore/2.0.0dev32 % git --version git version 2.24.3 (Apple Git-128)
AWS CLIの認証は下記の方法により実施済み。
やってみた
ここではAWSがGitHubに公開している公開Repositoryを複製対象とします。
複製元のRepositoryの情報を定義
% GITHUB_ACCOUNT=awslabs % REPO_NAME=aws-codedeploy-samples % GITHUB_REPO_URL=https://github.com/${GITHUB_ACCOUNT}/${REPO_NAME}.git
CodeCommitに複製先となる空Repositoryを作成
% aws codecommit create-repository \ --repository-name ${REPO_NAME}
GitHubから複製元のRepositoryをClone
% git clone --mirror ${GITHUB_REPO_URL} ${REPO_NAME} % cd ${REPO_NAME}
補足として、mirror
を使用するとリモートのすべてのブランチがcloneされます。
% git branch * master revert-35-protect_variables
またmirror
によりcloneしたRepositoryはワークツリーを使用した操作ができなくなっています。
% git checkout revert-35-protect_variables fatal: this operation must be run in a work tree
複製先のRepositoryの情報を定義
% CODECOMMIT_REGION=ap-northeast-1 % CODECOMMIT_REPO_URL=https://git-codecommit.${CODECOMMIT_REGION}.amazonaws.com/v1/repos/${REPO_NAME}
認証情報ヘルパーの設定
% git config --global credential.helper '!aws codecommit credential-helper $@' % git config --global credential.UseHttpPath true
確認のため下記コマンドを実行します。
% git config --global --edit
~/.gitconfig
に次のように書き込まれていることを確認します。
[credential] helper = !aws codecommit credential-helper $@ UseHttpPath = true
CodeCommit上のRepositoryにpush
下記コマンドを実行します。
% git push ${CODECOMMIT_REPO_URL} --all
pushの結果を確認してみます。AWS管理ダッシュボードで[デベロッパー用ツール > CodeCommit > Repository]を開き、pushしたRepositoryを選択します。
push結果がちゃんとRepositoryの内容に反映できていますね。
これでGitHubからCodeCommitにRepositoryを複製することができました。
注意点
macOSからHTTPSでCodeCommitRepositoryへの初回接続すると、その15分後から接続時に下記のような403エラーが出るようになります。
% git push ${CODECOMMIT_REPO_URL} --all fatal: unable to access 'https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/aws-codedeploy-samples/': The requested URL returned error: 403
ドキュメントによると、これはMacのキーチェーン保存される古い認証情報が使われてしまうため、下記の対応が必要とのことです。
macOS を使用している場合は、HTTPS を使用して CodeCommit Repositoryに接続します。HTTPS を使用して CodeCommit Repositoryに初めて接続すると、約 15 分後に後続のアクセスが失敗します。macOS のデフォルトの Git バージョンは、Keychain Access ユーティリティを使用して認証情報を保存します。セキュリティ対策のために、CodeCommit Repositoryへのアクセス用に生成されるパスワードは一時的なものであり、約 15 分後にキーチェーンに保存されている認証情報は機能しなくなります。期限切れの認証情報が使用されないようにするには、これらのいずれかが必要になります。
- デフォルトでキーチェーンを使用しない Git バージョンをインストールします。
- CodeCommit Repositoryの認証情報を提供しないように Keychain Access ユーティリティを設定します。
ここでは後者のキーチェーンを設定する方法を行ってみます。
FinderでKeychain Access
で検索すると[アプリケーション > ユーティリティ]配下で「キーチェーンアクセス」を探して開きます。
git-codecommit.<リージョン>.amazonaws.com
を探し、クリックして開きます。
[アクセス制御]タブでgit-credential-osxkeychain
を選択し、マイナス記号を選択してリストから削除します。
[変更内容を保存]をクリックします。
再度CodeCommitに対する接続(pushコマンド)を行ってみます。
% git push ${CODECOMMIT_REPO_URL} --all
すると下記のようなダイアログが表示されるので[拒否]をクリックします。拒否することによりキーチェーン内の古い認証情報を使わず接続を行います。
するとpushコマンドが正常に完了しました。CodeCommitへの接続が正常に行えるようになっていますね。
さらに注意点
さらに注意点として、ここまで行った設定のみの場合、前述のダイアログは接続毎に毎回表示されるため、毎回[拒否]をクリックする必要があります。そうなるとCodeCommit上のRepositoryを使用して開発を行う場合は不便です。
毎回の表示を回避する方法としては、ドキュメントでは下記の2通りの方法が示されているので、必要に応じて実施してください。(今回はRepositoryの複製のみが目的であり一時的にCodeCommitに接続できれば良かったため省略しました)
- HTTPS ではなく SSH を使用して CodeCommit に接続します。詳細については、「Linux、macOS、または Unix での SSH 接続の場合」を参照してください。
- 詳細については、「Git for macOS: 認証情報ヘルパーは正常に設定できましたが、リポジトリへのアクセスが拒否されます (403)」を参照してください。
参考
- AWS CLI 認証情報ヘルパーを使用した、Linux、macOS、または UNIX での AWS CodeCommit Repositoryへの HTTPS 接続のセットアップ手順 - AWS CodeCommit
- リポジトリを複製する - GitHub Docs
以上